package com.itheima.d2_buffered_stream;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.Reader;

/**
 * 目标：掌握字符缓冲输入流的用法。
 *
 * BufferedReader(字符缓冲输入流)
 * 作用：自带8K（8192）的字符缓冲池，可以提高字符输入流读取字符数据的性能。
 *          构造器
 * public BufferedReader(Reader r)      把低级的字符输入流包装成字符缓冲输入流管道，从而提高字符输入流读字符数据的性能
 *
 * 字符缓冲输入流新增的功能：按照行读取字符
 * public String readLine()     读取一行数据返回，如果没有数据可读了，会返回null
 *
 * 疑惑：
 *
 *             //会报错，我这里为什么只输出两行就不输出了呢？
 *             String zlen;
 *             int i=0;
 *             while ((zlen = zengbr.readLine()) != null){
 *                 System.out.println("这是第"+(++i)+"次读取行： "+zengbr.readLine());
 *             }
 *
 */
public class BufferedReaderTest2 {
    public static void main(String[] args)  {
        try (
                //1、创建一个文件字符输入流管道与源文件接通
                Reader fr = new FileReader("Day09Io-App2\\src\\itheima04.txt");
                //2、 创建一个字符缓冲输入流包装原始的字符输入流
                //Reader br = new BufferedReader(fr);   //这次就不用多态写法了，因为字符缓冲输入流有自己的新增特有功能，还用多态写，就无法调用了
                // 可以看BufferedReader源码，里面创建了一个8192大小的字符数组:cb = new char[sz];;
                BufferedReader br = new BufferedReader(fr);

                //自己试一试
                Reader aa = new FileReader("Day09Io-App2\\src\\itheima01.txt");
                BufferedReader zengbr = new BufferedReader(aa);
        ){
/*            char[] buffer = new char[3];
            int len;
            while ((len = br.read(buffer)) != -1){
                System.out.print(new String(buffer, 0, len));
            }
            */

            //注释掉上面的，使用readLine方法：
/*            System.out.println(br.readLine());
            System.out.println(br.readLine());
            System.out.println(br.readLine());
            System.out.println(br.readLine());      //没有内容，返回null
            */

            //假设文件内容有数千行，用循环来调用readLine方法
            String line; // 记住每次读取的一行数据
            //每次调用readLine方法返回的一行数据交给line记住，并且判断是否为空
            while ((line = br.readLine()) != null){
                System.out.println(line);
            }

            System.out.println("------------------自己试一试字符缓冲输入输出流------------------");
            System.out.println(zengbr.read());
            System.out.println((char) zengbr.read());

            char[] zChar = new char[3];
            System.out.println((char) zengbr.read(zChar));
            System.out.println(zengbr.read(zChar));
            System.out.println(zChar);  //saf
            System.out.println(zengbr.readLine());      //这一行读到的只剩下as了
            //循环调用readLine读完剩下的
/*            //我的错误写法：readLine返回值是String类型的
            int zlen;
            while ((zlen = zengbr.readLine())!=null){ }
            */
/*
            //会报错，我这里为什么只输出两行就不输出了呢？只是输出的不是zlen
            String zlen;
            int i=0;
            while ((zlen = zengbr.readLine()) != null){
                System.out.println("这是第"+(++i)+"次读取行： "+zengbr.readLine());
            }
*/
            String zlen;
            int i=0;
            while ((zlen = zengbr.readLine()) != null){
                System.out.println("这是第"+(++i)+"次读取行： "+zlen);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
